home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 2
/
United Public Domain Gold 2.iso
/
utilities
/
pu083.dms
/
pu083.adf
/
Morse
/
MORSE1.BAS
< prev
next >
Wrap
BASIC Source File
|
1989-06-09
|
5KB
|
128 lines
10 ' Morse Code Practice Program. Elwood Downey, WB0OEW, August, 1983.
20 ' Written for the IBM PC in Microsoft Basica, V1.1, for PC-DOS V1.1.
30 ' This program may be freely used, traded or copied but the author's
40 ' name and this stipulation shall remain as comments and the program
50 ' shall never be sold for profit.
60 ' Ported to and modified for the AMIGA by W1JT 8-9-88 .
70 CLS
90 '
100 ' select input source: either from a file, the keyboard or random.
101 PRINT:PRINT " ALL entries are to be in LOWER case letters":PRINT
102 PRINT" ENTER '!' TO START."
103 ZZZ$=INKEY$:IF ZZZ$="!" THEN 104 ELSE 103
104 CLS
PRINT "MORSE1.BAS CODE PRACTICE-AMIGA PORT BY W1JT, 8-9-88 "
110 INPUT "file name? (or `random' or `kybd:') ",F$
120 IF F$="random" THEN RANFILE=1 ELSE RANFILE=0
130 IF RANFILE=1 THEN RANDOMIZE VAL(RIGHT$(TIME$,2)): NCHRS=0: NGRPS=0
140 IF RANFILE=0 THEN OPEN F$ FOR INPUT AS #1
150 '
160 ' select speed
170 INPUT "wpm? ", WPM
180 '
190 ' initialize code strings
200 ' to add more characters, such as apostrophe, increase numcodes,
210 ' add code string and character at end of current lists and add case
220 ' to main loop, below.
230 NUMCODES = 41 ' . , / ? - plus 26 + 10
240 DIM CODES$(NUMCODES-1)
250 DIM CHARS$(NUMCODES-1)
260 FOR I=0 TO NUMCODES-1
270 READ CODES$(I)
280 NEXT
290 FOR I=0 TO NUMCODES-1
300 READ CHARS$(I)
310 NEXT
320 ' code strings. in one-to-one correspondence with characters, below.
330 DATA ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "...."
340 DATA "..", ".---", "-.-", ".-..", "--"
350 DATA "-.", "---", ".--.", "--.-", ".-.", "...", "-"
360 DATA "..-", "...-", ".--", "-..-", "-.--", "--.."
370 DATA "-----", ".----", "..---", "...--", "....-", "....."
380 DATA "-....", "--...", "---..", "----."
390 DATA ".-.-.-", "--..--", "-..-.", "..--..", "-...-"
400 ' characters.
410 DATA "A", "B", "C", "D", "E", "F", "G", "H"
420 DATA "I", "J", "K", "L", "M"
430 DATA "N", "O", "P", "Q", "R", "S", "T"
440 DATA "U", "V", "W", "X", "Y", "Z"
450 DATA "0", "1", "2", "3", "4", "5"
460 DATA "6", "7", "8", "9"
470 DATA ".", ",", "/", "?", "-"
500 CLS
505 PRINT
510 PRINT "Change line 620 to raise or lower tone frequency "
520 PRINT "Restart for slower or faster code."
530 PRINT "Enter Ctrl-C or <RT-AMIGA><.> to quit and restart."
540 PRINT
610 ' set defaults, init screen.
620 F = 600 ' initial tone frequency
640 GOSUB 1120 ' calculate dit, dah and space lengths.
650 GOSUB 1180 ' display wpm and freq
660 '
670 ' define character type checking functions
680 DEF FNLOWER(C$) = "a"<=C$ AND C$<="z"
690 DEF FNUPPER(C$) = "A"<=C$ AND C$<="Z"
700 DEF FNDIGIT(C$) = "0"<=C$ AND C$<="9"
710 '
720 ' main loop. read (or generate) each character, sound it and print it.
730 IF RANFILE THEN GOSUB 1240: GOSUB 900: PRINT CHARS$(MORSE);: GOTO 870
740 C$ = INPUT$(1,#1)
750 IF " "=C$ OR C$=CHR$(13) THEN GOSUB 990: GOTO 860
760 IF "."=C$ THEN MORSE=36: GOTO 850 ' morse <- codes$ array index
770 IF ","=C$ THEN MORSE=37: GOTO 850
780 IF "/"=C$ THEN MORSE=38: GOTO 850
790 IF "?"=C$ THEN MORSE=39: GOTO 850
800 IF "-"=C$ THEN MORSE=40: GOTO 850
810 IF FNLOWER(C$) THEN C$ = CHR$(ASC(C$)-32)
820 IF FNUPPER(C$) THEN MORSE=ASC(C$)-ASC("A"): GOTO 850
830 IF FNDIGIT(C$) THEN MORSE=ASC(C$)-ASC("0")+26: GOTO 850
840 GOTO 870
850 GOSUB 900
860 PRINT C$;
870 GOTO 730
880 '
890 ' sound dit for each ".", dah for each "-" in string codes$(morse)
900 FOR I=1 TO LEN(CODES$(MORSE))
910 IF MID$(CODES$(MORSE),I,1) = "." THEN GOSUB 1000 ELSE GOSUB 1010
920 NEXT
930 GOSUB 980
940 RETURN
950 '
960 ' produce elemental sounds, or silences.
970 SOUND F,ELE,0 : RETURN 'ELEMENT SPACE
980 SOUND F,ELE*3,0: RETURN ' character space, allow for previous trailing
990 SOUND F,ELE*7,0: RETURN ' word space, allow for trailing.
1000 SOUND F,DIT,200: GOSUB 970: RETURN ' dit
1010 SOUND F,DAH,200: GOSUB 970: RETURN ' dah
1110 ' calculate element timings. units are clock ticks, which are at 18.2hz.
1120 IF WPM<13 THEN CWPM=13 ELSE CWPM=WPM
1130 DIT = 21.84/CWPM: DAH = 3*DIT
1140 IF WPM>=13 THEN ELE=DIT ELSE ELE= (43.68 - 1.68 * WPM) / WPM
1150 RETURN
1160 '
1170 ' display current speed and frequency. return cursor where it was.
1180 COL=POS(0): ROW=CSRLIN: LOCATE 1,60
1190 PRINT " wpm: "; WPM: LOCATE 2,60: PRINT "freq: "; F; " "
1200 'LOCATE 2,5: PRINT WPM; " "
1210 LOCATE ROW,COL
1220 RETURN
1230 '
1240 ' set MORSE to random value from 0 up to numcodes to select random char.
1250 ' force a space character after every fifth time we are called
1260 ' and a newline before every 13 groups.
1270 IF NCHRS=5 THEN PRINT " ";: GOSUB 990: NCHRS=0: NGRPS=NGRPS+1
1280 IF NCHRS=0 AND NGRPS=13 THEN PRINT: NGRPS=0
1290 MORSE = INT(RND*NUMCODES)
1300 NCHRS=NCHRS+1: RETURN